
#include "iic.h"


uint8_t buf[8]={0};


//初始化IIC
void IIC_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure = {0};
    NVIC_InitTypeDef NVIC_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//使用PA1和PA2作为模拟IIC引脚，PA1对应SDA，PA2对应SCL
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ;   //开漏输出模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);



    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//RST
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //开漏输出模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);



    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//INT
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;   //输入模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource8);
    EXTI_InitStructure.EXTI_Line = EXTI_Line8;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);



    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    NVIC_EnableIRQ( EXTI9_5_IRQn );






    GPIO_SetBits(GPIOC,GPIO_Pin_9);
    Delay_Ms(10);

    GPIO_ResetBits(GPIOC,GPIO_Pin_9);
    Delay_Ms(5);

    GPIO_SetBits(GPIOC,GPIO_Pin_9);
    Delay_Ms(200);
//    static u8 i=0;
//     static u8 j=0;
//    while(1){
////        Delay_Ms(250); //延时250ms
////        GPIO_WriteBit(GPIOC, GPIO_Pin_6, (i==0) ? (i=Bit_SET):(i=Bit_RESET));
////        Delay_Ms(250); //延时250ms
////        GPIO_WriteBit(GPIOC, GPIO_Pin_7, (j==0) ? (j=Bit_SET):(j=Bit_RESET));
//
//    GPIO_ResetBits(GPIOC,GPIO_Pin_6);
//    GPIO_ResetBits(GPIOC,GPIO_Pin_7);
//    Delay_Ms(200);
//    GPIO_SetBits(GPIOC,GPIO_Pin_6);
//    GPIO_SetBits(GPIOC,GPIO_Pin_7);
//    Delay_Ms(200);
//   printf("hello");
//    }

    IIC_Idle_State();

//uint8_t ID = 0xff;
//
//uint8_t buf[8]={0};
////CST816D_Read_Id(&ID);
//
//
//
//        while(1){
//
//             CST816D_Read_Bytes(0x00,buf,7);
//               printf("x %d,y %d,active %d\r\n",((buf[3]&0x0f)<<8) | buf[4],
//                        ((buf[5]&0x0f)<<8) | buf[6],
//                        ((buf[2] & 0x0f)));
//             Delay_Ms(20);
//        }
}

//IIC空闲状态
//当IIC总线的SDA和SCL两条信号线同时处于高电平时，规定为IIC总线的空闲状态
void IIC_Idle_State()
{
    IIC_SDA_H;
    IIC_SCL_H;

    Delay_Us(4);
}

//IIC开始信号
//当IIC SCL线处于高电平时，SDA线由高电平向低电平跳变，为IIC开始信号，配置开始信号前必须保证IIC总线处于空闲状态
void IIC_Start()
{
    IIC_SDA_H;
    IIC_SCL_H;

    Delay_Us(4);

    IIC_SDA_L;
    Delay_Us(4);
    IIC_SCL_L;
    Delay_Us(4);
}

//IIC停止信号
//当IIC SCL线处于高电平时，SDA线由低电平向高电平跳变，为IIC停止信号
void IIC_Stop()
{
    IIC_SDA_L;
    IIC_SCL_H;

    Delay_Us(4);

    IIC_SDA_H;
}

//IIC发送一个字节数据（即8bit）
void IIC_SendByte(u8 data)
{
    u8 i;
    //先发送字节的高位bit7
    for (i = 0; i < 8; i++)
    {
        if (data & 0x80)  //判断8位数据每一位的值（0或1）
        {
            IIC_SDA_H;
        }
        else
        {
            IIC_SDA_L;
        }

        Delay_Us(4);      //控制SCL线产生高低电平跳变，产生通讯时钟，同时利用延时函数在SCL为高电平期间读取SDA线电平逻辑
        IIC_SCL_H;
        Delay_Us(4);
        IIC_SCL_L;

        if (i == 7)
        {
            IIC_SDA_H;    //控制SDA线输出高电平，释放总线，等待接收方应答信号
        }

        data <<= 1;       //左移一个bit
        Delay_Us(4);
    }
}

//IIC读取一个字节
u8 IIC_ReadByte(void)
{
    u8 i;
    u8 value;

    //读到第1个bit为数据的bit7
    value = 0;
    for(i = 0; i < 8; i++)
    {
        value <<= 1;
        IIC_SCL_H;
        Delay_Us(4);
        if (I2C_SDA_READ()) //利用延时函数在SCL为高电平期间读取SDA线电平逻辑
        {
            value++;
        }
        IIC_SCL_L;
        Delay_Us(4);
    }
    return value;
}


//IIC等待应答信号
u8 IIC_WaitAck(void)
{
    uint8_t rvalue;

    IIC_SDA_H;     //发送端释放SDA总线，由接收端控制SDA线
    Delay_Us(4);
    IIC_SCL_H;     //在SCL为高电平期间等待响应，若SDA线为高电平，表示NACK信号，反之则为ACK信号
    Delay_Us(4);
    if(I2C_SDA_READ())  //读取SDA线状态判断响应类型，高电平，返回去，为NACK信号，反之则为ACK信号
    {
        rvalue = 1;
    }
    else
    {
        rvalue = 0;
    }
    IIC_SCL_L;
    Delay_Us(4);
    return rvalue;
}

//产生应答信号ACK
void IIC_ACK(void)
{
    IIC_SDA_L;
    Delay_Us(4);
    IIC_SCL_H;   //在SCL线为高电平期间读取SDA线为低电平，则为ACK响应
    Delay_Us(4);
    IIC_SCL_L;
    Delay_Us(4);
    IIC_SDA_H;
}

//产生非应答信号NACK
void IIC_NACK(void)
{
    IIC_SDA_H;
    Delay_Us(4);
    IIC_SCL_H;   //在SCL线为高电平期间读取SDA线为高电平，则为NACK响应
    Delay_Us(4);
    IIC_SCL_L;
    Delay_Us(4);
}



void CST816D_Read_Id(uint8_t *buf){

    
    IIC_Start();
    IIC_SendByte(0x15<<1);
    IIC_WaitAck();

    IIC_SendByte(0x00);
    IIC_WaitAck();
    IIC_SendByte(0xA7);
    IIC_WaitAck();

    IIC_Start();//起始信号  主机变从机
	IIC_SendByte((0x15<<1)|1);
	IIC_WaitAck();
	*buf=IIC_ReadByte();

    IIC_NACK();



    IIC_Stop();


}



void CST816D_Read_Bytes(uint8_t reg,uint8_t *buf,uint8_t len){

    unsigned char len_value=len,flag=0;
    IIC_Start();
    IIC_SendByte(0x15<<1);
    IIC_WaitAck();
    IIC_SendByte(0x00);
    IIC_WaitAck();
    IIC_SendByte(reg);
    IIC_WaitAck();
//    IIC_SendByte(0xA7);
//    IIC_WaitAck();
if(len_value == 1){
        IIC_Start();//起始信号  主机变从机
     IIC_SendByte((0x15<<1)|1);
     IIC_WaitAck();
     *buf=IIC_ReadByte();

     IIC_NACK();
     IIC_Stop();


}else if (len_value > 1) {


          IIC_Start();//起始信号  主机变从机
         IIC_SendByte((0x15<<1)|1);
         IIC_WaitAck();


         do{
            if(len_value==0)
            {
                *(buf++)=IIC_ReadByte();
                IIC_NACK();
                break;
          }else{
                 *(buf++)=IIC_ReadByte();
                 IIC_ACK();
             }

         }while(len_value--);





         IIC_Stop();


}





}




void  touch_Get_cut(int *x,int *y,int *is_press){


//                CST816D_Read_Bytes(0x00,buf,7);
//
//				*x=((buf[3]&0x0f)<<8) | buf[4];
//				*y=((buf[5]&0x0f)<<8) | buf[6];
//				*is_press = ((buf[2] & 0x0f));

				//  printf("x %d,y %d,active %d\r\n",((touchpad_rx_buffer[3]&0x0f)<<8) | touchpad_rx_buffer[4],
				//  ((touchpad_rx_buffer[5]&0x0f)<<8) | touchpad_rx_buffer[6],
				//  ((touchpad_rx_buffer[2] & 0x0f)));


}



void EXTI9_5_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));;


void EXTI9_5_IRQHandler(void)
{
    //printf("INT");
     if(EXTI_GetITStatus(EXTI_Line8)!=RESET)
    {

            CST816D_Read_Bytes(0x00,buf,7);
              printf("x %d,y %d,active %d\r\n",((buf[3]&0x0f)<<8) | buf[4],
                       ((buf[5]&0x0f)<<8) | buf[6],
                       ((buf[2] & 0x0f)));
        EXTI_ClearITPendingBit(EXTI_Line8);
    }

}
